// #include "include/TPA.h"

// void TPA::assign_flow(int id, int& priority, bool is_scheduled) {
//     flows[id].priority = priority;
//     priority--;
//     flows[id].is_scheduled = is_scheduled;
//     max_lp_source          = max(max_lp_source, flows[id].cw);
//     max_lp_dest            = max(max_lp_dest, flows[id].cr);
//     assign_flow_set.insert(id);
//     unassign_flow_set.erase(id);
// }

// void TPA::run() {
//     int priority = flow_num;
//     unassign_flow_set.clear();
//     assign_flow_set.clear();
//     max_lp_source = max_lp_dest = max_ep_source = max_ep_dest = 0;
//     for (int i = flow_num; i >= 1; i--) {
//         unassign_flow_set.insert(i);
//         flows[i].is_scheduled = false;
//     }
//     // 相对截止时间降序，周期降序排序
//     // 排前面的优先级低（分配到的优先级数字大）
//     sort(flows + 1, flows + flow_num + 1, [&](flow& a, flow& b) {
//         if (a.relative_dl == b.relative_dl) {
//             if (a.period == b.period) {
//                 return a.size < b.size;
//             }
//             return a.period > b.period;
//         }
//         return a.relative_dl > b.relative_dl;
//     });
//     while (!unassign_flow_set.empty()) {
//         int  schedule_id = *unassign_flow_set.begin();
//         bool is_schedule = WCRT(flows[schedule_id]);
//         if (is_schedule) {
//             is_schedule = true;
//             assign_flow(schedule_id, priority, true);
//             continue;
//         }
//         is_schedule = false;
//         for (auto& id : unassign_flow_set) {
//             if (id == schedule_id) continue;
//             if (WCRT(flows[id])) {
//                 is_schedule = true;
//                 assign_flow(id, priority, true);
//                 break;
//             }
//         }
//         if (!is_schedule) {
//             assign_flow(schedule_id, priority, false);
//         }
//     }
// }

// void TPA::debug_flows() {
//     // static flow temp[FLOW_MAX_NUM];
//     for (int i = 1; i <= flow_num; i++) {
//         temp[i] = flows[i];
//     }
//     sort(temp + 1, temp + flow_num + 1, [&](flow& a, flow& b) { return a.id < b.id; });
//     printf("flow_id  priority  is_scheduled   wcrt\n");
//     for (int i = 1; i <= flow_num; i++) {
//         printf("%3d %10d %13d %13.2f\n", i, temp[i].priority, temp[i].is_scheduled, print_wcrt(temp[i].wcrt));
//     }
//     int hi_sche = 0, lo_sche = 0;
//     for (int i = 1; i <= flow_num; i++) {
//         if (temp[i].is_scheduled && temp[i].critical)
//             hi_sche ++;
//         else if (temp[i].is_scheduled && !temp[i].critical)
//             lo_sche ++;
//     }
//     printf("hi_sche: %d, lo_sche: %d, hi rate:%lf, lo rate:%lf\n", hi_sche, lo_sche, (double)hi_sche / flow_num * 2, (double)lo_sche / flow_num * 2);
// }


// void TPA::record_flows(string path) {
//     std::string base = path;
//     std::string ext;
//     size_t dot_pos = path.rfind('.');
//     if (dot_pos != std::string::npos) {
//         base = path.substr(0, dot_pos);
//         ext = path.substr(dot_pos); // e.g. ".csv"
//     }

//     int suffix = 1;
//     while (fs::exists(path)) {
//         path = base + "_" + std::to_string(suffix++) + ext;
//     }

//     std::ofstream out(path);
//     if (!out.is_open()) {
//         std::cerr << "Failed to open file: " << path << std::endl;
//         return;
//     }

//     out << "id,src,dst,critical,size,period,relative_dl,priority\n";
//     for (size_t i = 1; i <= flow_num; ++i) {
//         out << temp[i].id << ","
//             << temp[i].src << ","
//             << temp[i].dst << ","
//             << temp[i].critical << ","
//             << temp[i].size << ","
//             << temp[i].period << ","
//             << temp[i].relative_dl << ","
//             << temp[i].final_priority << "\n";
//     }
//     out.close();
// }